package cn.caplike.demo.nio._2017;

import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.nio.file.*;
import java.nio.file.attribute.BasicFileAttributes;
import java.util.List;

/**
 * 简介：Path & Paths; Files
 *
 * @author 李珂 2017年11月22日 上午8:57:07
 */
public class PathsAndFilesTest {
    private static Path dir0;
    private static Path dir1;
    private static Path dir1_5;
    private static Path dir2;

    static {
        dir0 = Paths.get("data/path");
        dir1 = Paths.get("data/path/path.txt");
        dir1_5 = Paths.get("data/path/path.java");
        dir2 = Paths.get("data/path/subpath1/subpath2/subpath3");
    }

    public static void run() throws IOException {
        Files.createDirectories(dir0);// 创建目录
        Files.copy(dir0, Paths.get("data/path-copy"), StandardCopyOption.REPLACE_EXISTING); // copy

        /* 创建文件 */
        if (!Files.exists(dir1))
            Files.createFile(dir1);
        if (!Files.exists(dir1_5))
            Files.createFile(dir1_5);

        Files.createDirectories(dir2);// 创建多级目录
    }

    /**
     * 简介：遍历
     *
     * @throws IOException
     * @author 李珂 2017年11月22日 上午9:21:33
     */
    public static void runTraverse() throws IOException {
        try (DirectoryStream<Path> stream = Files.newDirectoryStream(dir0, "*.java")) {
            stream.forEach(target -> {
                System.out.println(target.getFileName());
            });
        }
    }

    /**
     * 简介：递归
     *
     * @throws IOException
     * @author 李珂 2017年11月22日 上午9:27:45
     */
    public static void runRecursion() throws IOException {
        Files.walkFileTree(dir0, new SimpleFileVisitor<Path>() {
            /*
             * (non-Javadoc)
             *
             * @see java.nio.file.SimpleFileVisitor#visitFile(java.lang.Object,
             * java.nio.file.attribute.BasicFileAttributes)
             */
            @Override
            public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {
                System.out.println(file.getFileName());
                return FileVisitResult.CONTINUE;
            }
        });
    }

    /**
     * 简介：读写
     *
     * @throws IOException
     * @author 李珂 2017年11月22日 上午10:01:36
     */
    public static void runWriteAndRead() throws IOException {
        Path dir = Paths.get("data/path-write-read");
        if (!Files.exists(dir))
            Files.createDirectory(dir);

        Path srcPath = Paths.get("data/path-write-read/Ab.java");
        if (!Files.exists(srcPath))
            Files.createFile(srcPath);

        Path tarPath = Paths.get("data/path-write-read/He.java");
        if (!Files.exists(tarPath))
            Files.createFile(tarPath);

        /* 读取文件内容 */
        List<String> list = Files.readAllLines(srcPath, StandardCharsets.UTF_8);
        list.forEach(System.out::println);

        /* 把文件内容写入到tarPath */
        Files.write(tarPath, list, StandardCharsets.UTF_8, StandardOpenOption.WRITE);
    }

}
